package com.berchen.exception;

import com.alibaba.fastjson.JSONObject;
import com.berchen.common.result.Result;
import com.berchen.common.result.ResultEnum;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

/**
 * 全局异常处理类
 */
@ControllerAdvice
public class GlobalExceptionHandler {

    /**
     * 全局异常控制
     * @return
     */
   /* @ExceptionHandler(Exception.class)
    @ResponseBody
    public Result error(Exception e){

        return Result.error();
    }*/

    @ExceptionHandler(ZdyException.class)
    @ResponseBody
    public Result error(ZdyException e){
        return Result.error(e.toString());
    }


    /**
     * 缺少参数的异常处理 通过@NotNull @NotBlack  等注解  在接受参数的位置 @Valid 注解进行验证
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseBody
    public Result noparam(MethodArgumentNotValidException e){

        BindingResult bindingResult = e.getBindingResult();
        List<ObjectError> allErrors = bindingResult.getAllErrors();
        JSONObject data=new JSONObject();
        allErrors.stream().forEach(x->{
            // 获取每个字段的错误信息
            String errotStr = x.toString();

            // 截取字段名
            String[] split = errotStr.split(":");
            String error1 = split[0];   // Field error in object 'usetTestVo' on field 'name':
            String[] split1 = error1.split("'");
            String key=split1[3];


            // 截取字段为什么错误
            String error2=split[2];     //codes [usetTestVo.name,name]; arguments []; default message [name]]; default message [name 不能为空]
            String[] split2 = error2.split(";")[3].split("\\[");
            String value=split2[1];

            data.put(key,value.substring(0,value.lastIndexOf("]")));
        });
        Result fail = Result.set(ResultEnum.NO_PARAM);
        fail.setData(data);
        return fail;
    }
}
